package com.itheima.reggie.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.reggie.entity.ShoppingCart;
import com.itheima.reggie.mapper.ShoppingCartMapper;
import com.itheima.reggie.service.ShoppingCartService;
import com.itheima.reggie.utils.ThreadLocalUtil;
import com.itheima.reggie.web.R;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

import java.util.List;

@Service
public class ShoppingCartServiceImpl extends ServiceImpl<ShoppingCartMapper, ShoppingCart> implements ShoppingCartService {

    /**
     * 加入购物车，如果购物车中已有该菜品/套餐，数量+1
     *
     * @param shoppingCart 购物车向（可以是一个菜品，也可以是套餐）
     * @return 加入后的购物车向对象
     */
    @Override
    public R<ShoppingCart> add(ShoppingCart shoppingCart) {

        // 获取当前登录用户id，并设置进购物车项
        Long userId = ThreadLocalUtil.getCurrentId();
        shoppingCart.setUserId(userId);

        // 查询该购物车项是否已经加入购物车，条件：userId & dishId|| setmealId
        Long dishId = shoppingCart.getDishId();
        Long setmealId = shoppingCart.getSetmealId();
        LambdaQueryWrapper<ShoppingCart> qw = Wrappers.lambdaQuery(ShoppingCart.class)
                .eq(ShoppingCart::getUserId, userId)
                .eq(dishId != null, ShoppingCart::getDishId, dishId)
                .eq(setmealId != null, ShoppingCart::getSetmealId, setmealId);
        ShoppingCart scInDb = getOne(qw);

        // 如果没有，直接加入购物车
        if (ObjectUtils.isEmpty(scInDb)) {
            // 准备好插入到数据库的对象，数量设置为1
            shoppingCart.setNumber(1);
        } else {
            // 如果有，数量+1
            shoppingCart = scInDb;
            // BeanUtils.copyProperties(scInDb, shoppingCart);
            shoppingCart.setNumber(shoppingCart.getNumber() + 1);
        }

        // 统一保存，如果该对象有id则更新，否则新增
        if (saveOrUpdate(shoppingCart)) {
            // 组织数据并返回i
            return R.success("加入购物车成功", shoppingCart);
        }
        return R.fail("加入购物车失败");
    }


    /**
     * 查询购物车，有隐含条件：userId
     *
     * @return 当前登录用户的所有购物车项
     */
    @Override
    public R<List<ShoppingCart>> listByUserId() {
        // 获取登录用户的id
        Long userId = ThreadLocalUtil.getCurrentId();

        // 构建查询条件
        LambdaQueryWrapper<ShoppingCart> qw = Wrappers.lambdaQuery(ShoppingCart.class)
                .eq(ShoppingCart::getUserId, userId);

        // 查询，并组织数据返回
        List<ShoppingCart> shoppingCarts = list(qw);

        if (ObjectUtils.isEmpty(shoppingCarts)) {
            return R.fail("空空如也！");
        }
        return R.success("查询购物车成功",shoppingCarts);
    }
}
